home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / NR4.H < prev    next >
C/C++ Source or Header  |  1989-08-19  |  9KB  |  267 lines

  1. #ifndef    NR4MAXCIRC
  2.  
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "ax25.h"
  6.  
  7. /* nr4.h:  defines for netrom layer 4 (transport) support */
  8.  
  9. /* compile-time limitations */
  10.  
  11. #define    NR4MAXCIRC    20        /* maximum number of open circuits */
  12. #define NR4MAXWIN    127        /* maximum window size, send and receive */
  13.  
  14. /* protocol limitation: */
  15.  
  16. #define    NR4MAXINFO    236        /* maximum data in an info packet */
  17.  
  18. /* sequence number wraparound mask */
  19.  
  20. #define NR4SEQMASK    0xff    /* eight-bit sequence numbers */
  21.  
  22. /* flags in high nybble of opcode byte */
  23.  
  24. #define    NR4CHOKE    0x80
  25. #define    NR4NAK        0x40
  26. #define    NR4MORE        0x20    /* The "more follows" flag for */
  27.                             /* pointless packet reassembly */
  28.  
  29. /* mask for opcode nybble */
  30.  
  31. #define    NR4OPCODE    0x0f
  32.  
  33. /* opcodes */
  34.  
  35. #define NR4OPPID    0        /* protocol ID extension to network layer */
  36. #define    NR4OPCONRQ    1        /* connect request */
  37. #define    NR4OPCONAK    2        /* connect acknowledge */
  38. #define    NR4OPDISRQ    3        /* disconnect request */
  39. #define    NR4OPDISAK    4        /* disconnect acknowledge */
  40. #define    NR4OPINFO    5        /* information packet */
  41. #define    NR4OPACK    6        /* information ACK */
  42. #define NR4NUMOPS    7        /* number of transport opcodes */
  43.  
  44. /* minimum length of NET/ROM transport header */
  45.  
  46. #define    NR4MINHDR    5
  47.  
  48. /* host format net/rom transport header */
  49.  
  50. struct nr4hdr {
  51.     unsigned char opcode ;        /* opcode and flags */
  52.     unsigned char yourindex ;    /* receipient's circuit index */
  53.     unsigned char yourid ;        /* receipient's circuit ID */
  54.  
  55.     union {
  56.  
  57.         struct {                /* network extension */
  58.             unsigned char family ;    /* protocol family */
  59.             unsigned char proto ;    /* protocol within family */
  60.         } pid ;
  61.  
  62.         struct {                /* connect request */
  63.             unsigned char myindex ;    /* sender's circuit index */
  64.             unsigned char myid ;    /* sender's circuit ID */
  65.             unsigned char window ;    /* sender's proposed window size */
  66.             struct ax25_addr user ;    /* callsign of originating user */
  67.             struct ax25_addr node ;    /* callsign of originating node */
  68.         } conreq ;
  69.  
  70.         struct {                /* connect acknowledge */
  71.             unsigned char myindex ;    /* sender's circuit index */
  72.             unsigned char myid ;    /* sender's circuit ID */
  73.             unsigned char window ;     /* accepted window size */
  74.         } conack ;
  75.  
  76.         struct {                /* information */
  77.             unsigned char txseq ;    /* sender's tx sequence number */
  78.             unsigned char rxseq ;    /* sender's rx sequence number */
  79.         } info ;
  80.  
  81.         struct {                /* information acknowledge */
  82.             unsigned char rxseq ;    /* sender's rx sequence number */
  83.         } ack ;
  84.  
  85.     } u ;    /* End of union */
  86.  
  87. } ;
  88.  
  89. /* The netrom circuit pointer structure */
  90.  
  91. struct nr4circp {
  92.     unsigned char cid ;            /* circuit ID; incremented each time*/
  93.                                 /* this circuit is used */
  94.     struct nr4cb *ccb ;            /* pointer to circuit control block, */
  95.                                 /*  NULLNR4CB if not in use */
  96. } ;
  97.  
  98. /* The circuit table: */
  99.  
  100. extern struct nr4circp Nr4circuits[NR4MAXCIRC] ;
  101.  
  102. /* A netrom send buffer structure */
  103.  
  104. struct nr4txbuf {
  105.     struct timer tretry ;        /* retry timer */
  106.     unsigned retries ;            /* number of retries */
  107.     struct mbuf *data ;            /* data sent but not acknowledged */
  108. } ;
  109.  
  110. /* A netrom receive buffer structure */
  111.  
  112. struct nr4rxbuf {
  113.     unsigned char occupied ;    /* flag: buffer in use */
  114.     struct mbuf *data ;         /* data received out of sequence */
  115. } ;
  116.  
  117. /* address structure used in struct nr4cb. Unfortunately we cannot use
  118.  * struct ax25_addr here since we want to be compatible with the definition
  119.  * in socket.h
  120.  */
  121. #ifndef SOCK_STREAM
  122. struct nr4_addr {
  123.     char user_call[ALEN];
  124.     char user_ssid;
  125.     char node_call[ALEN];
  126.     char node_ssid;
  127. };
  128. #endif
  129. #define    NULLNRADDR    (struct nr4_addr *)0
  130.  
  131. /* The netrom circuit control block */
  132.  
  133. struct nr4cb {
  134.     unsigned mynum ;            /* my circuit number */
  135.     unsigned myid ;                /* my circuit ID */
  136.     unsigned yournum ;            /* remote circuit number */
  137.     unsigned yourid ;            /* remote circuit ID */
  138.     struct nr4_addr remote ;        /* address of remote node */
  139.     struct nr4_addr local ;            /* our own address */
  140.  
  141.     unsigned window ;            /* negotiated window size */
  142.  
  143.     /* Data for round trip timer calculation and setting */
  144.     
  145.     long srtt ;                    /* Smoothed round trip time */
  146.     long mdev ;                    /* Mean deviation in round trip time */
  147.     unsigned blevel ;            /* Backoff level */
  148.     unsigned txmax ;            /* The maximum number of retries among */
  149.                                 /* the frames in the window.  This is 0 */
  150.                                 /* if there are no frames in the window. */
  151.                                 /* It is used as a baseline to determine */
  152.                                 /* when to increment the backoff level. */
  153.                                 
  154.     /* flags */
  155.     
  156.     char clone ;                /* clone this cb upon connect */
  157.     char choked ;                /* choke received from remote */
  158.     char qfull ;                /* receive queue is full, and we have */
  159.                                 /* choked the other end */
  160.     char naksent ;                /* a NAK has already been sent */
  161.  
  162.     /* transmit buffers and window variables */
  163.  
  164.     struct nr4txbuf *txbufs ;    /* pointer to array[windowsize] of bufs */
  165.     unsigned char nextosend ;    /* sequence # of next frame to send */
  166.     unsigned char ackxpected ;    /* sequence number of next expected ACK */
  167.     unsigned nbuffered ;        /* number of buffered TX frames */
  168.     struct mbuf *txq ;            /* queue of unsent data */
  169.     
  170.     /* receive buffers and window variables */
  171.  
  172.     struct nr4rxbuf *rxbufs ;    /* pointer to array[windowsize] of bufs */
  173.     unsigned char rxpected ;    /* # of next receive frame expected */
  174.     unsigned char rxpastwin ;    /* top of RX window + 1 */ 
  175.     struct mbuf *rxq ;            /* "fully" received data queue */
  176.  
  177.     /* Connection state */
  178.     
  179.     int state ;                    /* connection state */
  180. #define NR4STDISC    0            /* disconnected */
  181. #define NR4STCPEND    1            /* connection pending */
  182. #define NR4STCON    2            /* connected */
  183. #define    NR4STDPEND    3            /* disconnect requested locally */
  184. #define NR4STLISTEN    4            /* listening for incoming connections */
  185.  
  186.     int dreason ;                /* Reason for disconnect */
  187. #define NR4RNORMAL    0            /* Normal, requested disconnect */
  188. #define NR4RREMOTE    1            /* Remote requested */
  189. #define    NR4RTIMEOUT    2            /* Connection timed out */
  190. #define    NR4RRESET    3            /* Connection reset locally */
  191. #define NR4RREFUSED    4            /* Connect request refused */
  192.  
  193.     /* Per-connection timers */
  194.     
  195.     struct timer tchoke ;        /* choke timeout */
  196.     struct timer tack ;        /* ack delay timer */
  197.  
  198.     struct timer tcd ;        /* connect/disconnect timer */
  199.     unsigned cdtries ;        /* Number of connect/disconnect tries */
  200.     
  201.     void (*r_upcall) __ARGS((struct nr4cb *,int16));
  202.                     /* receive upcall */
  203.     void (*t_upcall) __ARGS((struct nr4cb *,int16));
  204.                     /* transmit upcall */
  205.     void (*s_upcall) __ARGS((struct nr4cb *,int,int));
  206.                     /* state change upcall */
  207.     int user ;            /* user linkage area */
  208. } ;
  209.  
  210. #define    NULLNR4CB    (struct nr4cb *)0
  211.  
  212. /* Some globals */
  213.  
  214. extern unsigned short Nr4window ;    /* The advertised window size, in frames */
  215. extern long Nr4irtt ;            /* The initial round trip time */
  216. extern unsigned short Nr4retries ;    /* The number of times to retry */
  217. extern long Nr4acktime ;        /* How long to wait until ACK'ing */
  218. extern char *Nr4states[] ;        /* NET/ROM state names */
  219. extern char *Nr4reasons[] ;        /* Disconnect reason names */
  220. extern unsigned short Nr4qlimit ;        /* max receive queue length before CHOKE */
  221. extern long Nr4choketime ;        /* CHOKEd state timeout */
  222. extern struct ax25_addr Nr4user;    /* User callsign in outgoing connects */
  223.  
  224. /* function definitions */
  225.  
  226. /* In nr4subr.c: */
  227. void free_n4circ __ARGS((struct nr4cb *));
  228. struct nr4cb *get_n4circ __ARGS((int, int));
  229. struct mbuf *htonnr4 __ARGS((struct nr4hdr *));
  230. int init_nr4window __ARGS((struct nr4cb *, unsigned));
  231. int nr4between __ARGS((unsigned, unsigned, unsigned));
  232. struct nr4cb *match_n4circ __ARGS((int, int,
  233.     struct ax25_addr *, struct ax25_addr *));
  234. struct nr4cb *new_n4circ __ARGS((void));
  235. void nr4defaults __ARGS((struct nr4cb *));
  236. int nr4valcb __ARGS((struct nr4cb *));
  237. int ntohnr4 __ARGS((struct nr4hdr *, struct mbuf **));
  238.  
  239. /* In nr4.c: */
  240. void nr4input __ARGS((struct nr4hdr *hdr,struct mbuf *bp));
  241. int nr4output __ARGS((struct nr4cb *));
  242. void nr4sbuf __ARGS((struct nr4cb *, unsigned));
  243. void nr4sframe __ARGS((struct ax25_addr *, struct nr4hdr *, struct mbuf *));
  244. void nr4state __ARGS((struct nr4cb *, int));
  245.  
  246. /* In nr4timer.c */
  247. void nr4ackit __ARGS((void *));
  248. void nr4cdtimeout __ARGS((void *));
  249. void nr4txtimeout __ARGS((void *));
  250. void nr4unchoke __ARGS((void *));
  251.  
  252. /* In nr4user.c: */
  253. void disc_nr4 __ARGS((struct nr4cb *));
  254. int kick_nr4 __ARGS((struct nr4cb *));
  255. struct nr4cb *open_nr4 __ARGS((struct nr4_addr *, struct nr4_addr *, int,
  256.   void (*)(), void (*)(), void (*)(),int));
  257. struct mbuf *recv_nr4 __ARGS((struct nr4cb *, int16));
  258. void reset_nr4 __ARGS((struct nr4cb *));
  259. int send_nr4 __ARGS((struct nr4cb *, struct mbuf *));
  260.  
  261. /* In nrcmd.c: */
  262. void nr4_state __ARGS((struct nr4cb *, int, int));
  263.  
  264. #endif    /* NR4MAXCIRC */
  265.  
  266.  
  267.